/**
 * TP GRUPO _ 
 * ALGORITMOS Y PROGRAMACION III
 */

package modelo;

/**
 * @author Grupo _
 */

import java.util.ArrayList;
import java.util.Iterator;


public class Resultados{

    private ArrayList listaResultados;
   
   
 public Resultados(){
  listaResultados=new ArrayList();
 }
   
 public ArrayList getListaResultados(){
  return this.listaResultados;
 }
 
 private boolean sonIguales(double x1,double x2){ //Esta funcion redondea dos valores para mejorar la precision al compararlos
 double valx1;
 double valx2;
 valx1=x1*10000;
 valx1=Math.round(valx1);
 valx1=valx1/10000;
 valx2=x2*10000;
 valx2=Math.round(valx2);
 valx2=valx2/10000;
 return (valx1==valx2);
 }
 
 private boolean estaEn(double fx){  //Funcion que indica si un elemento pertenece o no a una lista
  boolean encontrado=false;
  Iterator it=this.listaResultados.iterator();
  while (it.hasNext()&&(!encontrado)){
   Valor valor=(Valor)it.next();
   encontrado=sonIguales(fx,valor.getFx());
   }
  return encontrado;
 }
   
 public void agregar(Valor elem){
  listaResultados.add(elem);
 }
   
 public ArrayList getMax(){
   ArrayList listaMaximos=new ArrayList();
   Valor max;
   Iterator it=this.listaResultados.iterator();
   max=((Valor)it.next());
   while (it.hasNext()){
   Valor valor=(Valor)it.next();
   if (valor.getFx()>max.getFx()){
     max=valor;
      }
  }
  Iterator it2=this.listaResultados.iterator();
  Valor valorAComparar;
  while (it2.hasNext()){
  valorAComparar=(Valor)it2.next();
  if (valorAComparar.getFx()==max.getFx())
    listaMaximos.add(valorAComparar);
  }
  return listaMaximos;
 }
   
 public ArrayList getMin(){
   ArrayList listaMinimos=new ArrayList();
   Valor min;
   Iterator it=this.listaResultados.iterator();
   min=((Valor)it.next());
    while (it.hasNext()){
   Valor valor=(Valor)it.next();
   if (valor.getFx()<min.getFx()){
     min=valor;
     }
    }
    Iterator it2=this.listaResultados.iterator();
    Valor valorAComparar;
    while (it2.hasNext()){
    valorAComparar=(Valor)it2.next();
    if (valorAComparar.getFx()==min.getFx())
    listaMinimos.add(valorAComparar);
  }
    return listaMinimos;
 
 }
   
 public ArrayList getIntersec(Resultados resotrafunc){  //Funcion que determina la interseccion entre 2 listas de resultados (funciones evaluadas)
   
  ArrayList intersecciones = new ArrayList();
  Iterator it=resotrafunc.getListaResultados().iterator();
  while (it.hasNext()){
   Valor valor=(Valor)it.next();
   if (this.estaEn(valor.getFx()))
   intersecciones.add(valor);
     }
  return intersecciones; 
 }
   
 public String toString(){
  String s=new String();
  Iterator it=this.listaResultados.iterator();
  while (it.hasNext())
   s+=((Valor)it.next()).toString();
   return s;
 }
}
